#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

//用命名管道实现文件拷贝
//读取管道,写入目标文件

int main()
{
    //打开需要拷贝的文件,以写的方式
    //其中的O_TRUNC的意思是open打开的是一个常规的文件,并且是以写的方式打开,那么会将这个文本的原有内容丢弃,文件大小变为0
    //如果是FIFO文件,那么这个标志就会进行忽略
    int outfd = open("./copy.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644);
    if (outfd == -1)
    {
        perror("open fail");
        exit(1);
    }

    //以读的方式打开管道
    int infd = open("./cp_fifo", O_RDONLY);
    if (infd == -1)
    {
        perror("open fail");
        exit(2);
    }

    char buf[1024];
    int ret_r;
    while((ret_r = read(infd, buf, sizeof(buf))))
    {
        write(outfd, buf, ret_r);
    }

    close(infd);
    close(outfd);
    //unlink()从文件系统中删除一个名称。如果该名称是指向文件的最后一个链接，且没有进程打开该文件，则删除该文件，并将其使用的空间用于重用。
//如果该名称是指向文件的最后一个链接，但任何进程仍然打开该文件，则该文件将保持存在，直到最后一个引用它的文件描述符关闭。
//如果引用套接字、fifo或设备的名称将被删除，但打开该对象的进程可以继续使用它。
    unlink("./cp_fifo");
    return 0;
}
